package club.service.impl;

import club.dao.UserMapper;
import club.pojo.User;
import club.service.UserService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * 用户服务实现类
 * 处理用户相关业务逻辑，包括用户查询、登录验证、创建用户、更新信息及分页管理等
 */
@Service
@Transactional // 声明式事务管理，确保数据库操作的原子性
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;
    // 注入用户数据访问层

    /**
     * 根据用户ID查询用户详情
     * @param id 用户ID
     * @return 用户对象，不存在则返回null
     */
    @Override
    public User findById(Integer id) {
        return userMapper.selectById(id);
        // 调用Mapper根据ID查询用户
    }

    /**
     * 根据用户名和状态查询用户列表（支持模糊查询和状态筛选）
     * @param userName 用户名（模糊匹配）
     * @param state 用户状态（可选，如0-正常，1-禁用）
     * @return 符合条件的用户列表
     */
    @Override
    public List<User> findByName(String userName, Integer state) {
        EntityWrapper<User> wrapper = new EntityWrapper<>();
        if (userName != null && !userName.isEmpty()) {
            wrapper.like("userName", userName);
            // 添加用户名模糊查询条件
        }
        if (state != null) {
            wrapper.eq("state", state);
            // 添加状态筛选条件
        }
        return userMapper.selectList(wrapper);
        // 执行查询
    }

    /**
     * 根据用户名模糊查询用户列表（简化版查询，仅筛选用户名）
     * @param userName 用户名（模糊匹配）
     * @return 符合条件的用户列表
     */
    @Override
    public List<User> showName(String userName) {
        EntityWrapper<User> wrapper = new EntityWrapper<>();
        if (userName != null && !userName.isEmpty()) {
            wrapper.like("userName", userName);
            // 添加用户名模糊查询条件
        }
        return userMapper.selectList(wrapper);
        // 执行查询
    }

    /**
     * 用户登录验证
     * @param userName 用户名
     * @param password 密码（需与数据库中加密后的密码一致）
     * @return 验证通过返回用户对象，失败返回null
     */
    @Override
    public User loginuser(String userName, String password) {
        // 1. 根据用户名构建查询条件
        User queryUser = new User();
        queryUser.setUserName(userName);
        User user = userMapper.selectOne(queryUser);
        // 查询用户

        // 2. 验证密码（注意：实际项目中密码应使用加密算法比对）
        if (user != null && user.getPassword().equals(password)) {
            return user;
            // 登录成功
        }
        return null;
        // 登录失败
    }

    /**
     * 更新用户信息（如修改密码、联系方式等）
     * @param user 包含更新字段的用户对象（需包含ID）
     * @return 更新成功返回1，失败返回0
     */
    @Override
    public Integer update(User user) {
        return userMapper.updateById(user);
        // 调用Mapper根据ID更新用户信息
    }

    /**
     * 分页查询用户列表（支持用户名模糊搜索）
     * @param userName 用户名（模糊匹配，可选）
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果对象，包含用户列表及分页信息
     */
    @Override
    public PageInfo<User> allUser(String userName, Integer pageNum, Integer pageSize) {
        // 1. 开启分页功能
        PageHelper.startPage(pageNum, pageSize);

        // 2. 构建查询条件
        EntityWrapper<User> wrapper = new EntityWrapper<>();
        if (userName != null && !userName.isEmpty()) {
            wrapper.like("userName", userName);
            // 添加用户名模糊查询条件
        }

        // 3. 执行查询并封装结果
        List<User> list = userMapper.selectList(wrapper);
        return new PageInfo<>(list);
        // 自动计算总页数、总记录数等
    }

    /**
     * 创建新用户
     * @param user 用户对象（需包含用户名、密码等必填字段）
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public int add(User user) {
        return userMapper.insert(user);
        // 调用Mapper插入新用户记录
    }

    /**
     * 根据用户ID删除用户记录
     * @param id 用户ID
     * @return 删除成功返回1，失败返回0
     */
    @Override
    public int del(Integer id) {
        return userMapper.deleteById(id);
        // 调用Mapper根据ID删除用户
    }
}